package busterminal.entity;

import busterminal.entity.service.RouteType;
import java.util.ArrayList;

/**
 * Маршрут (реализация)
 */
public class RouteImplementation extends AbstractEntityImplementation implements Route {

    /**
     * Номер маршрута
     */
    private String routeNumber;
    /**
     * Название маршрута
     */
    private String routeName;
    /**
     * Начало маршрута
     */
    private StoppingPoint startPoint;
    /**
     * Конец маршрута
     */
    private StoppingPoint endPoint;
    /**
     * Список промежуточных остановочных пунктов
     */
    private ArrayList<StoppingPoint> intermediateStoppingPointsList;
    /**
     * Тип маршрута, определяемый константой из {@link RouteType}
     */
    private RouteType routeType;

    /**
     * Конструктор по умолчанию
     */
    public RouteImplementation() {
    }

    /**
     * Конструктор для сущности маршрут
     * @param routeNumber номер маршрута
     * @param routeName название маршрута
     * @param startPoint начало маршрута
     * @param endPoint конец маршрута
     * @param intermediateStoppingPointsList список промежуточных остановочных пунктов
     * @param routeType тип маршрута, определяемый константой из {@link RouteType}
     */
    public RouteImplementation(String routeNumber, String routeName, StoppingPoint startPoint, StoppingPoint endPoint, ArrayList<StoppingPoint> intermediateStoppingPointsList, RouteType routeType) {
        this.routeNumber = routeNumber;
        this.routeName = routeName;
        this.startPoint = startPoint;
        this.endPoint = endPoint;
        this.intermediateStoppingPointsList = intermediateStoppingPointsList;
        this.routeType = routeType;
    }

    /**
     * Получить конец маршрута
     * @return конец маршрута
     */
    @Override
    public StoppingPoint getEndPoint() {
        return endPoint;
    }

    /**
     * Установить конец маршрута
     * @param endPoint конец маршрута
     */
    @Override
    public void setEndPoint(StoppingPoint endPoint) {
        this.endPoint = endPoint;
    }

    /**
     * Получить список промежуточных остановочных пунктов
     * @return список промежуточных остановочных пунктов
     */
    @Override
    public ArrayList<StoppingPoint> getIntermediateStoppingPointsList() {
        return intermediateStoppingPointsList;
    }

    /**
     * Установить список промежуточных остановочных пунктов
     * @param intermediateStoppingPointsList список промежуточных остановочных пунктов
     */
    @Override
    public void setIntermediateStoppingPointsList(ArrayList<StoppingPoint> intermediateStoppingPointsList) {
        this.intermediateStoppingPointsList = intermediateStoppingPointsList;
    }

    /**
     * Получить название маршрута
     * @return название маршрута
     */
    @Override
    public String getRouteName() {
        return routeName;
    }

    /**
     * Установить название маршрута
     * @param routeName название маршрута
     */
    @Override
    public void setRouteName(String routeName) {
        this.routeName = routeName;
    }

    /**
     * Получить номер маршрута
     * @return номер маршрута
     */
    @Override
    public String getRouteNumber() {
        return routeNumber;
    }

    /**
     * Установить номер маршрута
     * @param routeNumber номер маршрута
     */
    @Override
    public void setRouteNumber(String routeNumber) {
        this.routeNumber = routeNumber;
    }

    /**
     * Получить тип маршрута, определяемый константой из {@link RouteType}
     * @return тип маршрута, определяемый константой из {@link RouteType}
     */
    @Override
    public RouteType getRouteType() {
        return routeType;
    }

    /**
     * Установить тип маршрута, определяемый константой из {@link RouteType}
     * @param routeType тип маршрута, определяемый константой из {@link RouteType}
     */
    @Override
    public void setRouteType(RouteType routeType) {
        this.routeType = routeType;
    }

    /**
     * Получить начало маршрута
     * @return начало маршрута
     */
    @Override
    public StoppingPoint getStartPoint() {
        return startPoint;
    }

    /**
     * Установить начало маршрута
     * @param startPoint начало маршрута
     */
    @Override
    public void setStartPoint(StoppingPoint startPoint) {
        this.startPoint = startPoint;
    }

    /**
     * Получить строку, содержащую список промежуточных остановочных пунктов
     * @return строку, содержащая список промежуточных остановочных пунктов
     */
    @Override
    public String getIntermediateStoppingPointsString() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < intermediateStoppingPointsList.size(); i++) {
            if (i != intermediateStoppingPointsList.size() - 1) {
                sb.append(intermediateStoppingPointsList.get(i).getStoppingPointName().toString()).append(", ");
            } else {
                sb.append(intermediateStoppingPointsList.get(i).getStoppingPointName().toString());
            }
        }
        return sb.toString();
    }

    /**
     * Метод, возвращающий текстовое представление объекта
     * @return текстовое представление объекта
     */
    @Override
    public String toString() {
        return "Route{" + "id=" + getId() + ", routeNumber=" + routeNumber + ", routeName=" + routeName + ", startPoint=" + startPoint + ", endPoint=" + endPoint + ", intermediateStoppingPointsList=" + intermediateStoppingPointsList + ", routeType=" + routeType + '}';
    }
}
